package org.funtester.performance.books.chapter04.section3;

import org.funtester.performance.books.chapter03.section3.ThreadTask;
import org.funtester.performance.books.chapter03.section4.TaskExecutor;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 多用户查询卡券测试用例
 */
public class ManyUserQueryCardTest {

    public static void main(String[] args) throws InterruptedException {
        List<String> tokens = new ArrayList<>();//模拟读取配置文件中token信息
        for (int i = 0; i < 10000; i++) {
            tokens.add("token" + i);//添加token信息,模拟1万个用户
        }
        List<UserCenter> userCenters = new ArrayList<>();//用余生存储用户中心模块类
        for (String token : tokens) {//遍历token配置
            UserBase userBase = new UserBase(token);//创建用户基础类对象
            UserCenter userCenter = new UserCenter(userBase);//创建用户中心模块类对象
            userCenters.add(userCenter);//添加到集合中
        }
        int threadNum = 8;//并发线程数
        int totalNumPerThread = 100;//每个线程执行次数
        int rumpUpTime = 20;//预热时间
        List<ThreadTask> tasks = new ArrayList<>();
        for (int i = 0; i < threadNum; i++) {
            ThreadTask threadTask = new ThreadTask() {//创建线程任务
                @Override
                public void test() {
                    if (errorNum > executeNum) ABORT.set(true);//如果错误次数大于成功执行次数,则终止测试
                    int index = ThreadLocalRandom.current().nextInt(userCenters.size());//获取列表中随机索引
                    UserCenter userCenter = userCenters.get(index);//获取随机用户中心模块类对象
                    userCenter.queryCard(ThreadLocalRandom.current().nextInt(20));//查询用户卡券
                }
            };
            threadTask.totalNum = totalNumPerThread;//设置每个线程执行次数
            threadTask.costTime = new ArrayList<>(totalNumPerThread);//创建线程执行时间集合
            tasks.add(threadTask);
        }
        new TaskExecutor(tasks, "1万用户随机查询用户卡券性能测试", rumpUpTime).start();//启动测试
    }

}
